package br.edu.ifrn.tads.rettiwt.beans.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;

import br.edu.ifrn.tads.rettiwt.PMF;
import br.edu.ifrn.tads.rettiwt.beans.Mensagem;
import br.edu.ifrn.tads.rettiwt.beans.Usuario;

public class UsuarioDAO implements Serializable{
	private static UsuarioDAO dao;
	
	public static UsuarioDAO obterUsuarioDao(){
		if(dao == null){
			dao = new UsuarioDAO();
		}
		return dao;
		
	}
	public void postarMensagem(Long oid, Mensagem msg){
		try{
			Usuario usuario = this.getUsuarioById(oid);
			List<Long> lista = new LinkedList<Long>();
			if(usuario.getMensagensEnviadas() == null){
				usuario.setMensagensEnviadas(lista);
			}
			
			lista = usuario.getMensagensEnviadas();
			lista.add(msg.getOid());
			
			usuario.setMensagensEnviadas(lista);
		}finally{
			PMF.getManager().close();
		}
	}
	
	public void update(Usuario usuarioModificado){
		try{
			Usuario usuario = this.getUsuarioById(usuarioModificado.getId());
			
			usuario.setBiografia(usuarioModificado.getBiografia());
			usuario.setDataCriacao(usuarioModificado.getDataCriacao());
			usuario.setEmail(usuarioModificado.getEmail());
			usuario.setUsername(usuarioModificado.getUsername());
			usuario.setNome(usuarioModificado.getNome());
		}finally{
			PMF.getManager().close();
		}
	}
	
	public void postarRecadoPublico(String email, Mensagem msg){
		Transaction tx = PMF.getManager().currentTransaction();
		try{
			tx.begin();
				MensagemDAO msgDao = MensagemDAO.obterMensagemDAO();
				Usuario usuario = this.getUsuarioByEmail(email);
				ArrayList<Long> list = (ArrayList<Long>) usuario.getMensagensEnviadas();
				list.add(msg.getOid());
				msgDao.salvar(msg);
				usuario.setMensagensEnviadas(list);
			tx.commit();
		}finally{
			if(tx.isActive()){
				tx.rollback();
			}
			PMF.getManager().close();
		}
	}
	
	public void salvar(Usuario usuario){
		Transaction tx = PMF.getManager().currentTransaction();
		try{
			tx.begin();
			PMF.getManager().makePersistent(usuario);
			tx.commit();
		}finally{
			if(tx.isActive()){
				tx.rollback();
			}
			PMF.getManager().close();
		}		
	}
	
	public List<Usuario> todosUsuarios(){
		List<Usuario> lista = new ArrayList<Usuario>();  
		  try {
			  Query query = PMF.getManager().newQuery(Usuario.class);
			  lista.addAll((List<Usuario>)query.execute());
		  } finally {
			  PMF.getManager().close();
		  }  		    
		return lista;
	}
	

	public Usuario getUsuarioById(Long id){

		return PMF.getManager().getObjectById(Usuario.class, id);
	}
	
	public Usuario getUsuarioByEmail(String email){		
		Query query = PMF.getManager().newQuery(Usuario.class);
		query.setFilter("email == e");
		query.declareParameters("String e");
		
		List<Usuario> list = null;
		
		try{
			Usuario usuario = null;
			list = (List<Usuario>)query.execute(email);
			Iterator iterator = list.iterator();
			while(iterator.hasNext()){
				usuario = (Usuario)iterator.next();
				if(usuario.getEmail().equals(email)){
					return usuario;
				}	
			}
		}finally{
			PMF.getManager().close();
		}	
		return null;
	}
	public Usuario getUsuarioByUsername(String username){		
		Query query = PMF.getManager().newQuery(Usuario.class);
		query.setFilter("username == u");
		query.declareParameters("String u");
		
		List<Usuario> list = null;
		
		try{
			Usuario usuario = null;
			list = (List<Usuario>)query.execute(username);
			Iterator iterator = list.iterator();
			while(iterator.hasNext()){
				usuario = (Usuario)iterator.next();
				if(usuario.getUsername().equals(username)){
					return usuario;
				}	
			}
		}finally{
			PMF.getManager().close();
		}	
		return null;
	}
	
	public List<Usuario> dozeUsuariosSort(){
		List<Usuario> lista = new ArrayList<Usuario>();  
		  try {
			  Query query = PMF.getManager().newQuery(Usuario.class);
			  query.setRange(0, 3);
			  			  
			  lista.addAll((List<Usuario>)query.execute());
		  } finally {
			  PMF.getManager().close();
		  }  		    
		return lista;
	}
	
	
	
	
}
